package k2_oop.p6_relation.demo10;

import java.util.Arrays;

/**
 * 自已封装一个动态数组类，可以根据用户传递的数据，动态的对数组的长度进行扩展；
 * 类名是:MyArray 需要实现方法有
 */
public class MyArray {

    //给定数组的初始默认值
    private static final int DEFAULTCOUNT = 10;

    //初始化实际元素的数量
    private int size = 0;

    private int[] numsArray;

    /**
     * 无参的构造方法，就按照默认容量创建数组
     */
    public MyArray() {
        this.numsArray = new int[DEFAULTCOUNT];
    }

    /**
     * 按照指定的容量创建数组
     * @param count 指定的数组容量
     */
    public MyArray(int count) {
        //如果给定容量小于0，参数错误
        if(count<0){
            System.out.println("容量设置错误");
        }else if(count<DEFAULTCOUNT){
            //如果小于默认容量，按默认容量算
            this.numsArray = new int[DEFAULTCOUNT];
        }else{
            //如果大于默认容量，按实际给定
            this.numsArray = new int[count];
        }
    }

    /**
     * 添加一个值
     * @param value
     */
    public void add(int value){
        extendsSpace();
        this.numsArray[size++] = value;
    }

    /**
     * 向某个索引位置插入值
     * @param position
     * @param value
     */
    public void add(int position,int value){
        extendsSpace();
        for (int i = size; i > position ; i--) {
            numsArray[i] = numsArray[i-1];
        }
        numsArray[position] = value;
        size++;
    }

    /**
     * 扩容 此方法只给当前类中的方法使用，所以使用private修饰
     */
    private void extendsSpace(){
        if(size>=numsArray.length){
            //创建一个新数组，容量为原数组的1.5倍
            int[] numArrayNew = new int[numsArray.length+(numsArray.length>>1)];

            //把原数组的元素按位复制到新数组中
            for (int i = 0; i < numsArray.length; i++) {
                numArrayNew[i] = numsArray[i];
            }

            //把新数组赋值给当前的属性
            this.numsArray = numArrayNew;
        }
    }

    /**
     * 移除某个索引位置的值
     * @param index
     */
    public void remove(int index){
        for (int i = index; i < size-1 ; i++) {
            numsArray[i] = numsArray[i+1];
        }

        //如果实际的元素填满了整个数组，需要把最后一位置为初始值0
        numsArray[size-1] = 0;

        size--;
    }

    /**
     * 修改某个索引位置的值
     * @param position
     * @param value
     */
    public void set(int position,int value){
        if(position>=size){
            System.out.println("位置超出了范围");
        }else{
            numsArray[position] = value;
        }
    }

    /**
     * 获取某个索引位置的值
     * @param index
     * @return
     */
    public int get(int index){
        //如果指定的索引超出了范围，返回-1
        if(index>=size){
            return -1;
        }
        return numsArray[index];
    }

    /**
     * 返回实际的元素个数
     * @return
     */
    public int size(){
        return this.size;
    }

    public int[] getNumsArray() {
        return numsArray;
    }
}
